package unipi.servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import unipi.database.ErrorCodes;
import unipi.database.Tasks;
import unipi.helpers.HTMLPages;
import unipi.helpers.Hash;
import unipi.helpers.LoginCookie;
import unipi.helpers.Validator;

public class TaskProgress extends HttpServlet
{
	private static final long serialVersionUID = 1L;
	
	public TaskProgress()
	{
		super();
	}
	
	public void init() throws ServletException
	{
		
	
	}
	
	private String validateInputs(String taskid, String taskhash, String title, String desc, String hours, String date)
	{
		if(!Validator.isNumber(taskid))
			return "TASKCHANGED";
		
		if(!Hash.SHA1(taskid).equals(taskhash))
			return "TASKCHANGED";
		
		if(!Validator.isValid(title) || !Validator.isValid(desc))
			return "Οι χαρακτήρες ', \" και & δεν επιτρέπονται στα πεδία εισόδου.";
		
		if(!Validator.isNumber(hours))
			return "Το πεδίο Ώρες Εργασίας πρέπει να είναι αριθμός.";
		
		if(!Validator.isDate(date))
			return "Η ημερομηνία που εισάγατε στο πεδίο Ημερομηνία Εργασίας δεν είναι έγκυρη.";
		
		return null;	
		
	}
	
	private String getPage(String uid, String taskid, String message)
	{
		String content = "<h1>Πρόοδος Εργασίας</h1>";
		
		if(!Tasks.isAssigned(uid, taskid))
			content += "Η εργασία αυτή δεν υπάρχει.";
		else
		{
			Map<String, String> task = Tasks.get(taskid);
			
			if(task == null)
				content += "Η εργασία αυτή δεν υπάρχει.";
			else
			{
				String endDate = task.get("endDate") == null?"Δεν έχει ολοκληρωθεί":task.get("endDate");
				
				content += "<h2>Στοιχεία Εργασίας</h2>";
				content += "<table>";
				content += "<tr><td>Τίτλος: </td><td>" + task.get("title") + "</td></tr>";
				content += "<tr><td>Περιγραφή: </td><td>" + task.get("description") + "</td></tr>";
				content += "<tr><td>Ομάδα: </td><td>" + task.get("group") + "</td></tr>";
				content += "<tr><td>Απαιτούμενες Ώρες: </td><td>" + task.get("hoursRequired") + "</td></tr>";
				content += "<tr><td>Ποσοστό Ολοκλήρωσης: </td><td>" + task.get("percentCompleted") + "</td></tr>";
				content += "<tr><td>Ημερομηνία Ανάθεσης: </td><td>" + task.get("assignedDate") + "</td></tr>";
				content += "<tr><td>Προθεσμία: </td><td>" + task.get("dueDate") + "</td></tr>";
				content += "<tr><td>Ημερομηνία Έναρξης: </td><td>" + task.get("startDate") + "</td></tr>";
				content += "<tr><td>Ξεκίνησε στις: </td><td>" + task.get("startedDate") + "</td></tr>";
				content += "<tr><td>Ημερομηνία Ολοκλήρωσης: </td><td>" + endDate + "</td></tr>";
				content += "<tr><td>Ανάθεση από: </td><td>" + task.get("assignedBy") + "</td></tr>";
				
				String taskUsers = Tasks.getTaskUsers(taskid);
				
				if(taskUsers != null)
					content += "<tr><td>Αναθεση στους: </td><td>" + taskUsers + "</td></tr>";
				content += "</table>";				
				
				if(task.get("endDate") == null)
				{
					content += "<h2>Πρόοδος</h2>";
					
					content += HTMLPages.getSubmitForm("TaskProgress",
							new String[]{
							"Τίτλος",
							"Περιγραφή",
							"Ώρες Δουλειάς",
							"Ημερομηνία Εργασίας",
							"Ολοκλήρωση",
							"",
							""
							},
							new String[]{
							"<input class=\"mediumInput\" name=\"title\" type=\"text\" value=\"\" />",
							"<textarea  class=\"txtarea\" name=\"desc\" rows=\"6\" cols=\"40\" ></textarea>",
							"<input class=\"mediumInput\" name=\"hours\" type=\"text\" value=\"\" />",
							"<input class=\"mediumInput\" name=\"date\" type=\"text\" value=\"\" />",
							"<input type=\"checkbox\" name=\"completed\" value = \"yes\" />",
							"<input type=\"hidden\" name=\"taskid\" value=\"" + taskid + "\">",
							"<input type=\"hidden\" name=\"hash\" value=\"" + Hash.SHA1(taskid) + "\">"
							}, "Ενημέρωση") + message;
				}
			}				
		}
		
		return HTMLPages.getGeneralPage(content, uid);	
	}
	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		if(!LoginCookie.authCookie(request))
			response.sendRedirect("Login");
		else
		{
			String uid = LoginCookie.Get(request)[0];

			request.setCharacterEncoding("utf-8");
			String taskid = request.getParameter("taskid");	
			String taskhash = request.getParameter("hash");
			String title = request.getParameter("title");
			String desc = request.getParameter("desc");
			String hours = request.getParameter("hours");
			String date = request.getParameter("date");
			boolean done = request.getParameter("completed") == null?false:true;
			
			response.setContentType("text/html; charset=UTF-8");			
			PrintWriter out = response.getWriter();
			
			String validation = validateInputs(taskid, taskhash, title, desc, hours, date);
			
			if(validation == null)
			{				
				String message = "";
	
				ErrorCodes addPrg = Tasks.addProgress(title, desc, hours, date, taskid, uid, done);
				
				if(addPrg != ErrorCodes.OK)
				{
					message += "Παρουσιάστηκε πρόβλημα κατα την εισαγωγή της προόδου σας.";
					out.println(getPage(uid, taskid, message));		
				}
				else
					response.sendRedirect("Blog");
				
			}
			else if(validation.equals("TASKCHANGED"))
			{
				response.sendRedirect("ViewTasks");				
			}
			else
			{		
				out.println(getPage(uid, taskid, validation));				
			}
			
			out.close();	
		}
	}
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
	{
		if(!LoginCookie.authCookie(request))
			response.sendRedirect("Login");
		else
		{
			String uid = LoginCookie.Get(request)[0];

			request.setCharacterEncoding("utf-8");
			String taskid = request.getParameter("id");
			
			response.setContentType("text/html; charset=UTF-8");
			
			PrintWriter out = response.getWriter();
			
			out.println(getPage(uid, taskid, ""));
			
			out.close();				
		
		}
	}
	
}